




class SIJAINTI
{
    public:
    double X, Y, Z;
    void Aseta( double UusiX, double UusiY, double UusiZ);
};
const SIJAINTI NollaSijainti = { 0, 0, 0 };

double Etaisyys( SIJAINTI S1, SIJAINTI S2 );


struct ASENTO
{
    double Alfa,
           Beta,
           Gamma;
};
const ASENTO NollaAsento = { 0, 0, 0 };


class VEKTORI
{
    public:
    double X, Y, Z;
    
    
    void KulmatVersoriksi( double Alfa, double Beta );
    void KulmatVektoriksi( double Alfa, double Beta );

    void AsentoVersoriksi( ASENTO Asento );
    void AsentoVektoriksi( ASENTO Asento );
    
        
    void Kaanna( ASENTO DeltaAsento );
    void NollaVektoriksi();
    void Versoriksi();
    void AsetaPituus( double UusiPituus );
    double AnnaPituus();
    void Lisaa( VEKTORI LisausV );
    void Kulmiksi( double &Alfa, double &Beta );
    void Asennoksi( ASENTO &Asento );
    void Aseta( double UusiX, double UusiY, double UusiZ);
    void KerroLuvulla( double Luku);
    

};
    const VEKTORI NollaVektori = { 0, 0, 0};

double VektorienEriavyys( VEKTORI V1, VEKTORI V2 );

double Pistetulo( VEKTORI V1, VEKTORI V2 );
VEKTORI Vektoritulo( VEKTORI V1, VEKTORI V2 );


class MATRIISI4X4
{
    public:
    double M[16];
    
    void Orthonormalisoi();
    
    void KerroMatriisi( double M1[16], double M2[16] );
    
    void Aseta( const double UusiM[16] );

    void PyoritaV( double Kulma, VEKTORI V);
    void PyoritaX( double Alfa );
    void PyoritaY( double Beta );
    void PyoritaZ( double Gamma );
    
    VEKTORI OikealleV();
    VEKTORI EteenV();
    VEKTORI YlosV();
    
    void AsetaOikealleV( VEKTORI UusiAkseliV );
    void AsetaEteenV( VEKTORI UusiAkseliV );
    void AsetaYlosV( VEKTORI UusiAkseliV );

};
const double YksikkoMatriisi4x4[16] = { 1, 0, 0, 0,
                                        0, 1, 0, 0,
                                        0, 0, 1, 0,
                                        0, 0, 0, 1 };
const MATRIISI4X4 YksikkoMatriisiM4x4 = { 1, 0, 0, 0,
                                             0, 1, 0, 0,
                                             0, 0, 1, 0,
                                             0, 0, 0, 1 };


void OrthonormalizeMatrix(double m[16]);
void CrossProduct3f(double result[3], const double v1[3], const double v2[3]);
void NormalizeVector3f(double v[3]);



inline bool OnkoSisalla( double TarkasteltavaX, double TarkasteltavaY );


void AsteistaRadiaaniksi( double &Kulma );
void RadiaanistaAsteiksi( double &Kulma );
const double Pii = 3.14159265;



